package com.mdd.product.utils.sku;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 商品规格组合算法
 */
@Slf4j
public class SpecAlgorithm<T>{

    /**
     * 商品规格组合 T 泛型不限对象类型，可以是基本数据类型，也可以是String 或自定义类
     *
     * @param lists 设置的规格（传入的参数数量应对的是多少级的规格,T为声明的规格对象）
     * @return 返回的组合集合  数量公式 AxBxC...=N;
     */
    public  List<List<T>> specePlan(List<T>...lists){
        log.info("algorit",lists.toString());
        List<List<T>> arrays = new ArrayList<>();
        if(lists.length == 0 ){
            return arrays;
        }
        for(T object :lists[0]){
            List<T> newObj = new ArrayList<>();
            List<List<T>> arrayList = new ArrayList<>();
            for(int i = 1 ; i < lists.length ; i ++){
                arrayList.add(lists[i]);
            }
            addPlan(arrays,newObj,object,arrayList);
        }
        return arrays;
    }
    public  List<String> generateSkuCombine(List<List<String>> list, int index, String str, List<String> newObjs) {
        if (index == list.size()) {
            newObjs.add(str);
            return newObjs;
        }
        for (String dataStr : list.get(index)) {
            if (StringUtils.isBlank(str)) {
                generateSkuCombine(list, index + 1, str + dataStr, newObjs);
            } else {
                generateSkuCombine(list, index + 1, str + "," + dataStr, newObjs);
            }
        }
        return newObjs;
    }

    public static void main(String[] args) {
        //简单用String类型 来进行组合。 根据需求可以使用自定义类
        List<List<String>> arr=new ArrayList<>();
        String[] style = {"简朴","风采"};//风格
        arr.add(Arrays.asList(style));
        String[] color = {"黄","白","黑"};//颜色
        arr.add(Arrays.asList(color));
        String[] size = {"41","42","43","44"};//尺寸
        arr.add(Arrays.asList(size));
        String[] caizhi = {"皮革","PU","鸡皮"};//尺寸
        arr.add(Arrays.asList(caizhi));
        // String 映射， 可根据需求使用其他类型或自定义类。不懂什么是泛型 就得先了解泛型了
        new SpecAlgorithm<>().generateSkuCombine(arr,0,"",new ArrayList<>());
    }

    /**
     *
     * @param arrs      要返回的集合
     * @param newObjs  规划表
     * @param object    上一级的对象
     * @param lists     下级的集合
     */
    private void addPlan(List<List<T>> arrs, List<T> newObjs, T object, List<List<T>> lists){
        if(lists.size() == 0 || lists.get(0).size() == 0){
            newObjs.add(object);
            arrs.add(newObjs);
        }else {
            newObjs.add(object);
            for(T obj :lists.get(0)){
                List<List<T>> arrays = new ArrayList<>();
                for(int i = 1 ; i < lists.size() ; i ++){
                    arrays.add(lists.get(i));
                }
                ArrayList<T> objects = new ArrayList<>();
                objects.addAll(newObjs);
                addPlan(arrs, objects,obj,arrays);
            }
        }
    }

}

